#include<stdio.h>
#include<stdbool.h>
//使用冒泡排序模拟实现qsort
//函数原型: void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
//base:要排序的数组  num:数组元素个数  width:每个元素的大小   compare:比较方法


//把src的内容和desc的内容交换,共交换width个字节
void SwapByte(char* src,char* desc,int width) //按字节交换
{
  for(int i = 0;i<width;i++)
  {
    char tmp = *src;
    *src = *desc;
    *desc = tmp;
    //src和desc往后走交换
    src++,desc++;
  }
}

typedef int(*Compare)(const void*,const void*);//Compare是函数指针,有两个参数为const void* 返回类型:int
void my_qsort(void* base,size_t num,size_t width,Compare cmp)
{
  //num个元素,只需要比较num-1趟,每一趟可以让一个元素排到特定的位置
  for(size_t i = 0;i <num-1;i++)
  {
    bool flag = true;
    for(size_t j = 0;j<num-1-i;j++) //每一趟可以少比较一个排序好的元素
    {
      //当前需要比较的元素的起始位置:(char*)base + j*width (char*)base + (j+1)*width 
      if(cmp( (char*)base + j*width ,(char*)base+(j+1)*width)  > 0 )
      {
        flag = false;
        SwapByte((char*)base + j*width,(char*)base + (j+1)*width,width); //要把宽度(一个元素是多少字节也传过去)
      }
    }
      if(flag)
      {  
        break;
      }
    }
}